package modes

import (
	"fmt"
	"time"
)

type StudentInfoEx struct {
	SId       int64  `json:"sid" xorm:"notnull  'stu_id'"`           // 学员Id
	FistTopic int    `json:"fist_topic" xorm:"notnull 'fist_topic'"` // 0未进入 1首次进入
	LikePid   string `json:"like_pid" xorm:"notnull 'like_pid'"`     // 感兴趣项目，以，分割的字符串最多可选三个
	NewHelp   int    `json:"new_help" xorm:"notnull 'new_help'"`     // 新手帮助 1不需要帮助，2需要帮助
}

func (this *StudentInfoEx) TableName() string { return "studen_info_ex" }

func (this *StudentInfoEx) Get() (bool, error) {
	return Db(0).Get(this)
}
func (this *StudentInfoEx) TFirst() error {
	_, err := Db(0).Get(this)
	return err
}

func (this *StudentInfoEx) Save() (int64, error) {
	return Db(0).Insert(this)
}

func (this *StudentInfoEx) update(where string, field string) (int64, error) {
	return Db(0).Where(where).Cols(field).Update(this)
}
func (this *StudentInfoEx) StuIdSet(field string) (int64, error) {

	where := fmt.Sprintf("stu_id = %d", this.SId)
	return this.update(where, field)
}

//  获取当前学员的所有科目和项目
type UserClass struct {
	Phone int64 `json:"phone" xorm:"notnull  'phone'"`
	Cid   int64 `json:"cid" xorm:"notnull  'cid'"`
}

func (this *UserClass) TableName() string { return "user_class" }

//当前学员所有的项目和科目
type ResProjSubj struct {
	ProjList []TProj    `json:"projList" xorm:"-"`  //  项目列表
	TSubject []TSubject `json:"classList" xorm:"-"` //  科目列表
}
type TProj struct {
	Id          int64      `json:"id" xorm:"notnull  'id'"`     //  项目id
	Name        string     `json:"name" xorm:"notnull  'name'"` //  项目名称
	ExamAt      int        `json:"exam_at" xorm:"exam_at"`      //  考试时间
	Start       int        `json:"p_start" xorm:"start"`        // 考试时间启用不启用（0启用1 不启用）
	ExamAtState int        `json:"et_state" xorm:"exam_at_state"`
	SubjectList []TSubject `json:"subject_list" xorm:"-"` //  考试时间
}

type TSubject struct {
	Id   int64  `json:"s_id" xorm:"id"`     //科目ID
	PId  int64  `json:"s_pid" xorm:"pid"`   //项目ID
	Name string `json:"s_name" xorm:"name"` //科目名称
}

func (this *UserClass) TProjClass() ([]TProj, error) {
	projList := make([]TProj, 0)
	//  1.1获取用户有哪些班型
	cidlist := make([]int, 0)
	err := Db(0).Table("user_class").Where(" phone=? and close_at>=? and state=0", this.Phone, time.Now().Unix()).Select("cid").Find(&cidlist)
	if len(cidlist) == 0 || err != nil {
		return projList, err
	}
	//  1.2获取启动的班型
	useCidlist := make([]int, 0)
	err = Db(0).Table("class").In("id", cidlist).Select("id").Distinct("pid").Find(&useCidlist)

	//  2.根据班型id 获取所有的科目信息
	subClass := SubClass{}
	usesubjList, err := subClass.GetCidsByCids(useCidlist)
	if err != nil {
		return nil, err
	}
	subjListAll := make([]TSubject, 0)

	err = Db(0).Table("subject").In("id", usesubjList).Where("start=0").Find(&subjListAll)
	if err != nil {
		return nil, err
	}
	//  3.根据班型id 获取所有的项目信息
	usepidjList, err := subClass.GetPidsByCids(useCidlist)
	if err != nil {
		return nil, err
	}

	err = Db(0).Table("project").In("id", usepidjList).Find(&projList)
	if err != nil {
		return nil, err
	}
	//4.把项目中的拥有的科目进行嵌套进入数据中
	for i, _ := range projList {
		proj := &projList[i]
		if proj.ExamAtState == 1 {
			proj.ExamAt = 0
		}

		subjectList := make([]TSubject, 0)
		for _, subject := range subjListAll {

			if proj.Id == subject.PId {
				subjectList = append(subjectList, subject)
			}
		}
		proj.SubjectList = subjectList
	}
	resProj := make([]TProj, 0)

	for _, proj := range projList {
		if len(proj.SubjectList) > 0 {
			resProj = append(resProj, proj)
		}
	}

	return resProj, err
}

//项目的考试时间
func (this *Project) PExamtime() error {
	_, err := Db(0).Cols("exam_at").Get(this)
	return err
}

//当前学员某科目下章节练习的进度
type ResHStudy struct {
	Do  int `json:"do" xorm:"-"`  //已做题数
	Err int `json:"err" xorm:"-"` //做错的题数
	All int `json:"all" xorm:"-"` //总题量
}

func (this *TopicLogRe) HStudy() (ResHStudy, error) {
	var resHStudy ResHStudy

	toErr := TopicErr{
		UId: this.UId,
	}

	hasdoList, _ := this.GetListByUid()
	errList, _ := toErr.GetListByUid()
	allList := make([]int64, 0)
	Db(0).SQL(fmt.Sprintf("SELECT distinct qid allt from topiclibre WHERE n_id IN(SELECT id from toplibnamere WHERE sid >= %d and sid< %d  AND type_id=2  and state=0)", this.SId-(this.SId%100000), this.SId-(this.SId%100000)+100000)).Find(&allList)
	for _, allf := range allList {
		for _, hasdof := range hasdoList {
			if allf == hasdof {
				resHStudy.Do += 1
			}
		}
		for _, errf := range errList {
			if allf == errf {
				resHStudy.Err += 1
			}
		}
	}
	resHStudy.All = len(allList)
	return resHStudy, nil
}
